概念
FrameBuffer 的意思是,帧缓冲。
Frame 帧:你所看到的屏幕的图像,或者在一个窗口中的图像,就叫一帧。
Buffer 缓冲:一段RAM,用来暂存图像数据,这些数据会被直接写入到显示设备。
帧缓冲就相当于介于 图形操作 和 图像输出中间的一个中间人。将程序对图形数据的处理操作,反馈到显示输出上。
显卡(显存中的数据) <-> 帧缓冲(程序对其中的数据进行处理) <-> 显示器(输出图像)
帧缓冲可用于,实现原先视频卡并不支持的分辨率:
显卡可能并不支持你当前某个更大分辨率的显示器,但是可以通过帧缓冲获取显卡的显存中的数据,处理之后,实现更大的分辨率的图像,然后将数据直接输出到显示器上。
驱动分析
1.Framebuffer帧缓冲设备
1) 重要结构
Framebuffer 驱动在 Linux 中是标准的显示设备的驱动。
对于 **PC 系统**,它是显卡的驱动 ;
对于**嵌入式SOC处理器系统**,它是 LCD 控制器或者其他显示控制器的驱动。
同时该设备属于一个字符设备,在文件系统中设备节点是 /dev/fbx。
一个系统可以有多个显示设备,最常见的有 /dev/fb0 /dev/fb1 ,如果在/dev目录下没有发现这个文件,那么需要去修改 Linux 系统中相应的配置脚本。
在**安卓系统**中,Framebuffer设备驱动的主设备号通常为 29 ,次设备号递增而生成。
在此,我借用某内核驱动大牛GQB做的驱动框架图做分析,如有侵权,请联系我删除,谢谢!
Framebuff的结构框架和实现:
我们可以先来看看在framebuffer驱动框架中相关的重要数据结构:
1 | struct fb_ops { |
这个结构体记录了这个设备驱动的全部相关的信息,
其中就包括设备的设置参数,状态,还有对应底层硬件操作的回调函数。
在Linux中,每一个帧缓冲设备都必须对应一个fb_info,fb_info在/linux/fb.h中:
1 | struct fb_info { |
2) fbmem.c
和其它的内核代码中的字符驱动类似,同样,如果你要使用这个驱动,你必须去注册这个设备驱动。
显示驱动的分析都是由 drivers/video/fbmem.c 开始 。
我们可以发现 fbmem.c 里定义 register_framebuffer/unregister_framebuffer
由分析可以得知,
drivers/video/rockchip/lcdc/rk3288_lcdc.c 中的 probe 函数(rk3288_lcdc_probe)中有调用 rk_fb_register
drivers/video/rockchip/rk_fb.c 中的 rk_fb_register 调用 register_framebuffer
注册了一个平台总线设备的驱动程序。
编写framebuffer用户态程序需要以下步骤:
1、初始化framebuffer
2、向framebuffer写数据
3、退出framebuffer
1 |
|
至此,我们的framebuffer上层调用程序就写完了,当然这个程序你看不到什么图片,只能看到一块被映射的区域,然后printf不断的在打印数据。
如果你有兴趣,可以写一个图片数据进去,这时候要用到bmp,yuyv格式的图片知识,让图片可以显示在屏幕上.